package main

import (
	"fmt"
	"os"
	"runtime"
	"runtime/pprof"
	"time"
)

func main() {
	fmt.Println("=== 内存分析工具 ===")
	fmt.Println("开始收集内存使用信息...")

	// 创建tmp目录
	if _, err := os.Stat("./tmp"); os.IsNotExist(err) {
		fmt.Println("创建tmp目录...")
		if err := os.MkdirAll("./tmp", 0755); err != nil {
			fmt.Printf("无法创建tmp目录: %v\n", err)
			return
		}
	}

	// 分配一些内存来模拟程序运行
	fmt.Println("分配一些内存...")
	var largeSlice []byte
	for i := 0; i < 10000; i++ {
		largeSlice = append(largeSlice, make([]byte, 1024*1024)...) // 每次分配1MB
	}

	// 强制垃圾回收
	fmt.Println("执行垃圾回收...")
	runtime.GC()

	// 获取内存统计信息
	var m runtime.MemStats
	runtime.ReadMemStats(&m)
	fmt.Printf("内存统计信息:\n")
	fmt.Printf("  分配的内存总量: %d MB\n", m.Alloc/1024/1024)
	fmt.Printf("  系统分配的内存: %d MB\n", m.Sys/1024/1024)
	fmt.Printf("  堆内存: %d MB\n", m.HeapAlloc/1024/1024)
	fmt.Printf("  GC 次数: %d\n", m.NumGC)

	// 生成内存分析文件
	fmt.Println("\n生成内存分析文件...")
	memFile, err := os.Create("./tmp/mem.prof")
	if err != nil {
		fmt.Printf("无法创建内存分析文件: %v\n", err)
		return
	}
	defer memFile.Close()

	if err := pprof.WriteHeapProfile(memFile); err != nil {
		fmt.Printf("无法写入内存分析数据: %v\n", err)
		return
	}

	fmt.Printf("\n内存分析文件已保存到: %s\n", memFile.Name())
	fmt.Println("\n使用以下命令分析内存使用情况:")
	fmt.Println("  go tool pprof ./tmp/mem.prof")
	fmt.Println("\n在pprof交互式提示符下，可以使用以下命令:")
	fmt.Println("  top - 查看内存使用最多的函数")
	fmt.Println("  list <function> - 查看特定函数的内存使用")
	fmt.Println("  web - 在浏览器中可视化内存使用情况")

	// 尝试直接运行pprof分析
	fmt.Println("\n尝试直接运行pprof分析...")
	time.Sleep(2 * time.Second)
}
